package objetos.armas;

import java.util.Random;
import org.jdom.*;
import juego.Escenario;
import objetos.ObjetoMovil;
import objetos.proyectiles.*;

/*
 * La torpedera es un arma especial, porque puede disparar tres tipos 
 * distintos de proyectiles: Torpedo, Rastreador, y Adaptable. Su disparar
 * devuelve uno de �stos al azar. Adem�s, dispone de un m�todo para disparar 
 * cada uno de los proyectiles, y para ver la munici�n de cada uno.
 */
public class Torpedera extends Arma {
	private int cantRastreadores = 00;
	private int cantAdaptables = 00;

	/* Constructores */
	public Torpedera(ObjetoMovil base, int balas, int rastreadores,
			int adaptables) {
		super(base, balas);
		this.setCantRastreadores(rastreadores);
		this.setCantAdaptables(adaptables);
	}

	public Torpedera(ObjetoMovil base, int balas, int rastreadores) {
		super(base, balas);
		this.setCantRastreadores(rastreadores);
	}

	public Torpedera(ObjetoMovil base, int balas) {
		super(base, balas);
	}

	/* Metodos de disparo */
	@Override
	public Proyectil disparar() {
		Random rdm = new Random();
		int num = rdm.nextInt(3);
		switch (num) {
		case 0:
			return this.dispararAdaptable();
		case 1:
			return this.dispararRastreador(null);
		case 2:
			return this.dispararTorpedo();
		default:
			return this.disparar();
		}
	}

	public Torpedo dispararTorpedo() {
		if (this.getBalas() <= 0) {
			return null;
		}
		this.setBalas(this.getBalas() - 1);
		return new Torpedo(this.getBase());
	}

	public Rastreador dispararRastreador() {
		ObjetoMovil objetivo = Escenario.getInstance().darObjetivoPara(
				this.getBase());
		return this.dispararRastreador(objetivo);
	}

	public Rastreador dispararRastreador(ObjetoMovil destino) {
		if (this.getCantRastreadores() <= 0) {
			return null;
		}
		this.cantRastreadores -= 1;
		return new Rastreador(this.getBase(), destino);
	}

	public Adaptable dispararAdaptable() {
		if (this.getCantAdaptables() <= 0) {
			return null;
		}
		this.cantAdaptables -= 1;
		return new Adaptable(this.getBase());
	}

	public void recargarRastreador(int rastas) {
		this.setCantRastreadores(this.getCantRastreadores() + rastas);
	}

	public void recargarAdaptables(int adapt) {
		this.setCantAdaptables(this.getCantAdaptables() + adapt);
	}

	public void setCantRastreadores(int cantRastreadores) {
		this.cantRastreadores = cantRastreadores;
	}

	public int getCantRastreadores() {
		return cantRastreadores;
	}

	public void setCantAdaptables(int cantAdaptables) {
		this.cantAdaptables = cantAdaptables;
	}

	public int getCantAdaptables() {
		return cantAdaptables;
	}

	/* Persistencia */

	/* Constructor a partir de nodoXML */
	public Torpedera(Element nodo) {
		this(null, 0);
		this.setBalas(Integer.parseInt(nodo.getAttributeValue("balas")));
		this.cantRastreadores = Integer.parseInt(nodo
				.getAttributeValue("rastreadores"));
		this.cantAdaptables = Integer.parseInt(nodo
				.getAttributeValue("adaptables"));
	}

	/* NodoXML a partir de instancia */
	@Override
	public Element obtenerNodo() {
		Element nodo = new Element("torpedera");

		nodo.setAttribute(new Attribute("balas", String
				.valueOf(this.getBalas())));
		nodo.setAttribute(new Attribute("rastreadores", String
				.valueOf(this.cantRastreadores)));
		nodo.setAttribute(new Attribute("adaptables", String
				.valueOf(this.cantAdaptables)));

		return nodo;
	}

}
